package cn.jtcoding.springframework.aop.aspect;

import java.lang.reflect.Method;

/**
 * 定义AOP骨架(结构)，提供相关钩子方法
 */
public abstract class DefaultAspect {
    /**
     * 前置通知
     * @param clazz 被代理的目标类
     * @param method 被代理的方法
     * @param args 方法参数
     * @throws Throwable 向外抛出异常
     */
    public void before(Class<?> clazz, Method method, Object[] args) throws Throwable {

    }

    /**
     * 后置通知
     * @param clazz 被代理的目标类
     * @param method 被代理的方法
     * @param args 方法参数
     * @param returnValue 返回值
     * @return 返回值
     * @throws Throwable 向外抛出异常
     */
    public Object afterReturning(Class<?> clazz, Method method, Object[] args, Object returnValue) throws Throwable {
        return returnValue;
    }

    /**
     * 后置异常通知
     * @param clazz 被代理的目标类
     * @param method 被代理的方法
     * @param args 方法参数
     * @param e 异常信息
     * @throws Throwable 向外抛出异常
     */
    public void afterThrowing(Class<?> clazz, Method method, Object[] args, Throwable e) throws Throwable {
        throw e;
    }
}
